package com.shycloud.mido.organ.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.shycloud.mido.organ.api.dto.ScheduleDTO;
import com.shycloud.mido.organ.api.dto.ScheduleDataDTO;
import com.shycloud.mido.organ.api.dto.UseLessonDetailDTO;
import com.shycloud.mido.organ.api.dto.UserLessonDTO;
import com.shycloud.mido.organ.api.entity.ScheduleEntity;
import com.shycloud.mido.organ.api.entity.ScheduleStudentEntity;
import com.shycloud.mido.organ.api.entity.TeacherStudentEntity;
import com.shycloud.mido.organ.api.vo.*;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;

public interface ScheduleMapper extends BaseMapper<ScheduleEntity> {


	//获取消课列表
	IPage<UserLessonDTO> userLessonPage(
		Page<UserLessonDTO> page, 
		@Param("orgId") String orgId,
		@Param("month") String month,
		@Param("teacherName") String teacherName);

	//消课列表详情
	IPage<UseLessonDetailDTO> useLessonDetail(
		Page<UseLessonDetailDTO> page, 
		@Param("orgId") String orgId,
		@Param("type") Integer type,
		@Param("teacherId") String teacherId);
    /**
     * 获取待排课学生列表
     *
     * @param page        分页对象
     * @param scheduleDTO 待排课学生DTO
     * @return ScheduleDTO
     */
    IPage<ScheduleDTO> getStudentSchedulePage(Page<ScheduleDTO> page, @Param("query") ScheduleDTO scheduleDTO);

    /**
     * 校验教师上课时间是否冲突
     *
     * @param startDate 上课日期
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param teacherId 教师id
     * @return
     */
    int checkScheduleTeacher(@Param("startDate") LocalDate startDate, @Param("startTime") LocalTime startTime, @Param("endTime") LocalTime endTime, @Param("teacherId") String teacherId);

	/**
	 * 校验修改时教师上课时间是否冲突
	 *
	 * @param startDate 上课日期
	 * @param startTime 开始时间
	 * @param endTime   结束时间
	 * @param teacherId 教师id
	 * @return
	 */
	int checkScheduleTeacherByUpt(@Param("startDate") LocalDate startDate, @Param("startTime") LocalTime startTime, @Param("endTime") LocalTime endTime, @Param("teacherId") String teacherId, @Param("scheduleId") String scheduleId);

    /**
     * 校验学生上课时间是否冲突
     *
     * @param startDate 上课日期
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param studentId 学生id
     * @return
     */
    int checkScheduleStudent(@Param("startDate") LocalDate startDate, @Param("startTime") LocalTime startTime, @Param("endTime") LocalTime endTime, @Param("studentId") String studentId);

	/**
	 * 校验学生上课时间是否冲突
	 *
	 * @param startDate 上课日期
	 * @param startTime 开始时间
	 * @param endTime   结束时间
	 * @param studentId 学生id
	 * @return
	 */
	int checkScheduleStudentByUpt(@Param("startDate") LocalDate startDate, @Param("startTime") LocalTime startTime, @Param("endTime") LocalTime endTime, @Param("studentId") String studentId, @Param("scheduleId") String scheduleId);


	/**
     * 获取跟班排课列表-一对一
     *
     * @param page        分页对象
     * @param scheduleDTO 待排课学生DTO
     * @return ScheduleDTO
     */
    IPage<TeacherCourseVO> getTeacherCourseList(Page<ScheduleDTO> page, @Param("query") ScheduleDTO scheduleDTO);

    /**
     * 教师课程表
     *
     * @param scheduleDTO ScheduleVO
     * @return
     */
    List<ScheduleDataDTO> selectScheduleByTeacher(@Param("query") ScheduleDTO scheduleDTO);

	/**
	 * 手机端教师课程表
	 *
	 * @param scheduleDTO ScheduleVO
	 * @return
	 */
	List<ScheduleDataDTO> selectMobileScheduleByTeacher(@Param("query") ScheduleDTO scheduleDTO);

    /**
     * 获取教师学生数
     *
     * @param scheduleDTO ScheduleDTO
     * @return 剩余课节数
     */
    String getStudentCountByTeacher(@Param("query") ScheduleDTO scheduleDTO);

    /**
     * @author: Cxc
     * @Date: 2019/10/17 14:59
     * @Description: 查询排课表 看老师的下面是否有该学生的课程
     */
    List<ScheduleDTO> selectScheduleByStudentTeacher(@Param("query") TeacherStudentEntity teacherStudentEntity);

    /**
     * 教师已完成课程列表
     *
     * @param scheduleDTO ScheduleDTO
     * @return 已完成课程列表
     */
    List<ScheduleDataDTO> selectTeacherScheduleListDone(@Param("query") ScheduleDTO scheduleDTO);

    /**
     * 获取教师单驱剩余课节数
     *
     * @param scheduleDTO ScheduleDTO
     * @return 剩余课节数
     */
    String getTeacherSinglePurchase(@Param("query") ScheduleDTO scheduleDTO);


    /**
     * 课节统计
     *
     * @param teacherId
     * @param orgId
     * @param date
     * @return
     */
    List<CountClassVO> teacherClass(@Param("teacherId") String teacherId, @Param("orgId") String orgId, @Param("date") String date);

    /**
     * 获取跟班排课列表-一对多
     *
     * @param page        分页对象
     * @param scheduleDTO 待排课学生DTO
     * @return TeacherCourseVO
     */
    IPage<TeacherCourseVO> getTeacherCourseListMany(Page<ScheduleDTO> page, @Param("query") ScheduleDTO scheduleDTO);

    /**
     * 学生课程表
     *
     * @param scheduleDTO ScheduleVO
     * @return
     */
    List<ScheduleDataDTO> selectScheduleByStudent(@Param("query") ScheduleDTO scheduleDTO);

	/**
	 * 学生课程表
	 *
	 * @param scheduleDTO ScheduleVO
	 * @return
	 */
	List<ScheduleDataDTO> selectMobileScheduleByStudent(@Param("query") ScheduleDTO scheduleDTO);

    /**
     * 学生课程表
     *
     * @param scheduleDTO ScheduleVO
     * @return
     */
    List<ScheduleDataDTO> getStudentScheduleList(@Param("query") ScheduleDTO scheduleDTO);

    /**
     * 教师7天 课时列表
     *
     * @param teacherId 教师ID
     * @return
     */
    TeacherMinutesVO teacherMinutes(@Param("teacherId") String teacherId, @Param("date") String date);

    /**
     * 教师查询指定课程学生列表
     *
     * @param scheduleDTO ScheduleDTO
     * @return 剩余课节数
     */
    List<ScheduleDTO> selectStudentListByType(@Param("query") ScheduleDTO scheduleDTO);

	/**
	 * 教师查询指定课程全部学生列表
	 *
	 * @param scheduleDTO ScheduleDTO
	 * @return 剩余课节数
	 */
	List<ScheduleDTO> selectAllStudentListByType(@Param("query") ScheduleDTO scheduleDTO);

    /**
     * 教师待完成课程列表
     *
     * @param scheduleDTO ScheduleDTO
     * @return 待完成课程列表
     */
    List<ScheduleDataDTO> selectTeacherScheduleListTodo(@Param("query") ScheduleDTO scheduleDTO);

    /**
     * 获取教师双驱剩余课节数
     *
     * @param scheduleDTO ScheduleDTO
     * @return 剩余课节数
     */
    String getTeacherDoublePurchase(@Param("query") ScheduleDTO scheduleDTO);

	/**
	 * 获取教师剩余课节数
	 *
	 * @param scheduleDTO ScheduleDTO
	 * @return 剩余课节数
	 */
	String getTeacherPurchaseByType(@Param("query") ScheduleDTO scheduleDTO);

	/**
	 * 获取学生剩余课节数
	 *
	 * @param scheduleDTO ScheduleDTO
	 * @return 剩余课节数
	 */
	String getStudentPurchaseByType(@Param("query") ScheduleDTO scheduleDTO);

	/**
	 *  课节统计
	 * @param teacherId
	 * @param orgId
	 * @param date
	 * @return
	 */
	List<CountIncomeVO> teacherIncome(@Param("teacherId") String teacherId, @Param("orgId") String orgId, @Param("date") String date);

	/**
	 * 教师课程数量
	 * @param id 教师ID
	 * @return
	 */
	int selectByTeacher(@Param("id")  String id);

	/**
	 * 学生已上课程数量
	 * @param id
	 * @return
	 */
	int selectByStudent(@Param("id")  String id);

	/**
	 * 课节统计
	 *
	 * @param studentId
	 * @param orgId
	 * @param date
	 * @return
	 */
	List<CountClassVO> studentClass(@Param("studentId") String studentId, @Param("orgId") String orgId, @Param("date") String date);

	/**
	 * 查询学生列表
	 * @param teacherId 教师ID
	 * @return
	 */
	List<ScheduleStudentEntity> selAllByTeacher(@Param("teacherId")String teacherId,@Param("scheduleId") String scheduleId);

	/**
	 * 根据课程ID查询课程详情
	 *
	 * @param scheduleId String
	 * @return R
	 */
	List<StudentListVO> selectScheduleById(@Param("scheduleId") String scheduleId);

	/**
	 * 查询教师上课提醒推送(前一天)
	 *
	 * @param startDate LocalDate
	 * @return R
	 */
	List<SchedulePushVO> selScheduleTeacherPush(@Param("startDate") LocalDate startDate);

	/**
	 * 查询学生上课提醒推送(前一天)
	 *
	 * @param startDate LocalDate
	 * @return R
	 */
	List<SchedulePushVO> selScheduleStudentPush(@Param("startDate") LocalDate startDate);

	/**
	 * 查询教师上课提醒推送(当天)
	 *
	 * @param startDate LocalDate
	 * @return R
	 */
	List<SchedulePushVO> selTodayScheduleTeacherPush(@Param("startDate") LocalDate startDate, @Param("startTime") LocalTime startTime, @Param("endTime") LocalTime endTime);

	/**
	 * 查询学生上课提醒推送(当天)
	 *
	 * @param startDate LocalDate
	 * @return R
	 */
	List<SchedulePushVO> selTodayScheduleStudentPush(@Param("startDate") LocalDate startDate, @Param("startTime") LocalTime startTime, @Param("endTime") LocalTime endTime);

	/**
	 * 取得学生课程消耗提醒
	 *
	 * @param startDate LocalDate
	 * @return R
	 */
	List<SchedulePushVO> selScheduleOverStudentPush(@Param("startDate") LocalDate startDate, @Param("startTime") LocalTime startTime, @Param("endTime") LocalTime endTime);
	/**
	 * 查询当天课程数量
	 *
	 * @param startDate LocalDate
	 * @return R
	 */
	List<ScheduleCountVO> getTodayScheduleCount(@Param("orgId") Integer orgId, @Param("startDate") LocalDate startDate);
	/**
	 * 查询一周课程数量
	 *
	 * @param startDate LocalDate
	 * @return R
	 */
	List<ScheduleCountVO> getWeekScheduleCount(@Param("orgId") Integer orgId, @Param("startDate") LocalDate startDate,  @Param("endDate") LocalDate endDate);

	/**
	 * 课程详情
	 *
	 * @param page,scheduleDTO
	 * @return java.util.List<com.shycloud.mido.organ.api.vo.ScheduleVO>
	 * @author nianhua.jiang
	 * @date 2020/4/10 18:22
	 */
	IPage<ScheduleVO> searchScheduleByStudentId(Page<ScheduleDTO> page, @Param("query") ScheduleDTO scheduleDTO);

}
